library(tidyverse)
exported_package_author <- read.csv("exported_funs_exts_ggplot2_tidyverse_org.csv")

exported_package_author %>% tibble() %>% distinct()
## # A tibble: 5,415 × 3
##    user       repo    fun_exported     
##    <chr>      <chr>   <chr>            
##  1 YaoxiangLi ggpca   ggpca            
##  2 YaoxiangLi ggpca   run_app          
##  3 thomasp85  ggforce FacetCol         
##  4 thomasp85  ggforce FacetGridPaginate
##  5 thomasp85  ggforce FacetMatrix      
##  6 thomasp85  ggforce FacetRow         
##  7 thomasp85  ggforce FacetStereo      
##  8 thomasp85  ggforce FacetWrapPaginate
##  9 thomasp85  ggforce FacetZoom        
## 10 thomasp85  ggforce GeomArc          
## # ℹ 5,405 more rows
exported_package_author %>% 
  mutate(fun_prefix = fun_exported %>% str_extract(".*?_")) %>% 
  remove_missing() %>% 
  select(repo, fun_prefix) %>% 
  group_by(fun_prefix) %>% 
  filter(n() > 20) %>% 
  filter(repo != "ggforce") %>% 
  ggedgelist:::ggedgelist_quick(layout = "fr", include_names = T)
## Warning: Removed 1196 rows containing missing values or values outside the
## scale range.

exported_package_author %>%  
  mutate(fun_prefix = fun_exported %>% str_extract(".*?_")) %>% 
  mutate(user_repo = paste0(user, "/", repo)) %>% 
  # filter(n() < 200, .by = user_repo) %>% 
  # sample_n(500) %>% 
  select(fun_prefix, fun_exported, user_repo) %>% 
  filter((fun_prefix %in% c("stat_", "facet_", "geom_", "coord_", "theme_", "scale_"))) %>% 
  pivot_longer(cols= c(user_repo, fun_prefix)) %>% 
  select(fun_exported, value) %>% 
  ggedgelist:::ggedgelist_quick(layout = "fr", include_names = T)

library(tidyverse)
pkgs <- as_tibble(tools::CRAN_package_db())
gg_pkgs <- pkgs %>% 
  select(Package, Depends, Imports, Suggests) %>% 
  filter(
    str_detect(Package, "^gg"),
    if_any(-Package, ~ str_detect(.x, "ggplot2"))
  ) %>% 
  mutate(
    dep_grid = str_detect(Depends, "\\bgrid\\b") | str_detect(Imports, "\\bgrid\\b"),
    dep_dplyr = str_detect(Depends, "\\bdplyr\\b") | str_detect(Imports, "\\bdplyr\\b")
  ) %>% 
  drop_na()

gg_pkgs %>% 
  pivot_longer(cols = dep_grid:dep_dplyr) %>% 
  filter(value) %>% 
  select(Package, name, everything()) ->
gg_pkgs_edgelist


gg_pkgs_edgelist %>% 
  ggedgelist:::ggedgelist_quick(include_names = T, 
                                layout = "fr") +
  ggforce::geom_mark_hull(
    aes(x = x, y = y)
  )

gg_pkgs_tbl_graph <- tidygraph::as_tbl_graph(gg_pkgs_edgelist)
  
gg_pkgs_tbl_graph %>% 
  tidygraph::activate(nodes) %>% 
  as_tibble() %>% 
  mutate(is_import = name %in% c("dep_grid", "dep_dplyr")) %>% 
  mutate(node_color = case_when(name == "dep_dplyr" ~ "magenta",
                                     name == "dep_grid" ~ "khaki4",
                                     TRUE ~ "darkgrey")) %>% 
  mutate(name = ifelse(name == "dep_grid", "imports grid", name)) %>% 
  mutate(name = ifelse(name == "dep_dplyr", "imports dplyr", name)) %>% 
  mutate(node_size = is_import*2.5 + .8) ->
gg_pkgs_tbl_graph_nodes
library(threejs)  
## Loading required package: igraph
## 
## Attaching package: 'igraph'
## The following objects are masked from 'package:lubridate':
## 
##     %--%, union
## The following objects are masked from 'package:dplyr':
## 
##     as_data_frame, groups, union
## The following objects are masked from 'package:purrr':
## 
##     compose, simplify
## The following object is masked from 'package:tidyr':
## 
##     crossing
## The following object is masked from 'package:tibble':
## 
##     as_data_frame
## The following objects are masked from 'package:stats':
## 
##     decompose, spectrum
## The following object is masked from 'package:base':
## 
##     union
fed <-  
  tidygraph::as.igraph(gg_pkgs_tbl_graph)  
igraph::graph_attr(fed, "layout") <- NULL  

V(fed)$size <- gg_pkgs_tbl_graph_nodes$node_size
V(fed)$color <- gg_pkgs_tbl_graph_nodes$node_color
V(fed)$shape <- gg_pkgs_tbl_graph_nodes$name
E(fed)$linewidth <- .25

graphjs(g = fed, bg = "gray10",  
        showLabels = T,  
        layout = list(  
          layout_with_fr(fed, dim = 3)),  
                  main = "")

Closing remarks, Other Relevant Work, Caveats